# 滑动窗口（双指针实现）

class Solution:
    def lengthOfLongestSubstring(self,s:str):
        window = set()
        n = len(s)
        left = 0
        right = 0
        res = 0
        while right < n:
            # 右侧不在窗口里面,加入窗口
            if s[right] not in window:
                window.add(s[right])
                right += 1
                res = max(res, right - left)
            else:
                #易错点：不要忘记移除左边的
                window.remove(s[left])
                left += 1

        return res

## 示例 1:
# 输入: s = "abcabcbb"
# 输出: 3
# 解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。

# # 示例 2:
# 输入: s = "bbbbb"
# 输出: 1
# 解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。

# #示例 3:
# 输入: s = "pwwkew"
# 输出: 3
# 解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
#      请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。
#print(s)

#测试数据
s = "abcabcbb"

solution = Solution()
print(solution.lengthOfLongestSubstring(s))

s = "bbbbb"
solution = Solution()
print(solution.lengthOfLongestSubstring(s))

s = "pwwkew"
solution = Solution()
print(solution.lengthOfLongestSubstring(s))
